function timeout(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

async function asyncPrint(value, ms) {
  await timeout(ms);
  console.log(value)
}

asyncPrint('hello world', 500);


// async函数内部return语句返回的值，会成为then方法回调函数的参数
async function f() {
	return "hello world"
}

f().then(v => console.log(v))



// async function f() {
//   throw new Error('出错了');
// }

// f().then(
//   v => console.log(v),
//   e => console.log(e)
// )
// Error: 出错了

async function f() {
  try {
    await Promise.reject('出错了');
  } catch(e) {
  }
  return await Promise.resolve('hello world');
}

f()
.then(v => console.log(v))


// (async function () {
//   for await (const x of ['a', 'b']) {
//     console.log(x);
//   }
// })();

// yield* 语句

// async function* gen1() {
//   yield 'a';
//   yield 'b';
//   return 2;
// }

// async function* gen2() {
//   const result = yield* gen1();
// }

// (async function () {
//   for await (const x of gen2()) {
//     console.log(x);
//   }
// })();
// a
// b

// ==================
// async function takeAsync(asyncIterable, count=Infinity) {
//   const result = [];
//   const iterator = asyncIterable[Symbol.asyncIterator]();
//   while (result.length < count) {
//     const {value,done} = await iterator.next();
//     if (done) break;
//     result.push(value);
//   }
//   return result;
// }

// async function f() {
//   async function* gen() {
//     yield 'a';
//     yield 'b';
//     yield 'c';
//   }

//   return await takeAsync(gen());
// }

// f().then(function (result) {
//   console.log(result); // ['a', 'b', 'c']
// })
